use std::{net::SocketAddr, sync::OnceLock};

use bytes::{Bytes, BytesMut};
use tools::ResultEx;
pub use sip2::distribute::DIALOG_DISTIBUTE;
pub use sip2::dialog::DialogEvent;
pub use sip2::register::reg_ser::USER_HOLD;
pub use sip2::dialog::dialog::Dialog;

///调用此模块内的命令,以进行转接对象的操作
pub mod call_command;
///自己编写直接sip对接代码
pub mod sip2;
///三汇板卡的相关驱动接口
#[cfg(feature = "synway")]
pub mod synway_call;

#[cfg(test)]
pub mod tests;

pub mod sdp;

pub(crate) mod audio_codes;
///rtp相关的模块
pub mod rtp;
pub mod wav;

///编解码接口.
pub trait Codec {
	fn write_to(&self, buf: &mut BytesMut);
	///从一个bytes里面获取当前字段数据.
	///
	/// 获取数据以后,当前buf将会被变化,已经被读取过的数据将会被移除.
	/// buf: 需要获取的数据.
	fn from_bytes(buf: &mut Bytes) -> ResultEx<Self>
	where
		Self: Sized;
}

pub(crate) fn empty_sockaddr() -> SocketAddr {
	static SA: OnceLock<SocketAddr> = OnceLock::new();
	SA.get_or_init(|| "0.0.0.0:0".parse().unwrap()).clone()
}
